示例展示了基于物理的着色和 HDR 后处理在 Kanzi 中的用法。由于基于物理的着色和 HDR 后处理仍处于开发阶段,因此可以通过这些示例抢先了解在以后的 Kanzi 版本中能够使用的技术。
主要功能:
您可以在下面这些示例工程中找到一些示例,以了解基于物理的材质的使用方法:
支持后处理功能的高级材质需要 OpenGL ES 3.x 或者具有一组扩展的 OpenGL ES 2.0。当使用 OpenGL ES 2.0 时,需要以下 OpenGL ES 扩展:
即便无法获得这些扩展,也依然可以使用基于物理的材质和光源,但目前如果没有这些扩展,将无法使用后处理功能。
要使用后处理,在工程 (Project) > 中至少将目标图形 API (Target Graphics API) 属性设为 OpenGL ES 2.0 扩展包 (OpenGL ES 2.0 Extension Pack)。
后处理需要执行以下主要步骤:
要使用后处理,您需要建立下面这些资源:
资源。Post_Processing 示例工程需要使用示例工程中的纹理、编译器、渲染通道、材质类型、着色器、材质、自定义属性类型等资源。
您还需要使用 "Prefabs/Quad Scene" 预设件。这个场景预设件只包含一个特制的对象:一个范围为 (-1, -1) 到 (1, 1) 的四边形。四边形具有一个 "Quad" 标签,后处理编译器会使用它为要对纹理应用后处理效果的渲染通道指定对象源。请勿修改这个预设件。
示例工程有两个版本。Post_Processing_Simple 几乎无需设置,而 Post_Processing 有一些额外的页面,用于显示已执行和未执行后处理的场景以及显示中间纹理。
示例工程的目标分辨率为 1920x1080。示例工程的调试版本具有可实现另外几种分辨率的资源。
主场景预设件模板。主场景必须来自于一个预设件。在示例工程中,此预设件被称为 "Prefabs/Main Scene"。您需要将要使用后处理功能渲染的内容放在这里。
为了支持基于物理的材质着色,场景预设件必须具有下面这些属性:
此外,必须将场景预设件模板的 "Prefab preview mode" 属性设置为 1。值将在占位符中被重写。这样,当预览预设件占位符合成(值 1)时,材质着色器会执行另一次的色调映射。通常在后处理(值 0)之后或即将结束时执行色调映射。
有关这些属性的详细说明,请参阅属性类型 (Property Types)。
场景到纹理的视口。来自上一步骤的节点 ("Page") 必须包含一个用于将场景渲染到纹理的视口。在 Post_Processing_Simple 示例工程中,视口名为 "Page/Scene to Texture"。
必须将视口的图层长宽比 (Layer Aspect Ratio) 属性设置为与目标分辨率的长宽比匹配的值。在示例工程中,目标分辨率为 1920x1080,长宽比为 1.777。
视口还应具有一个别名,以便于访问图层长宽比 (Layer Aspect Ratio) 属性。在示例工程中,"Screen" 的资源字典具有 "Viewport" 别名。
"Scene to Texture" 的场景占位符。来自上一步骤的视口 ("Page/Scene to Texture") 必须具有一个场景占位符,占位符用于将来自 ("Prefabs/Main Scene") 步骤的 "Main Scene" 预设件模板实例化。在示例工程中,场景占位符名 "Scene to Texture/Scene (Main Scene)"。
场景占位符必须具有值为 "Render to Texture (1920x1080) Composer" 的 Composer 属性值。
必须将场景占位符的 "Prefab Preview Mode" 属性设置为 0。这样会命令材质着色器正常运行(不执行额外的色调映射)。
节点会将主场景的内容渲染到 "HDR Render 1920x1080" 渲染目标纹理,随后会将纹理用作后处理操作的输入。
允许访问 "Inverse Exposure" 属性。主场景 (Main Scene) 预设件模板的预览 (Preview) 合成需要使用曝光值的值进行色调映射。由于预设件无法访问除预设件以外的任何内容,因此属性存储在预设件中,并可供使用预设件占位符的工程使用。
来自上一步骤的 ("Scene (Main Scene)") 必须具有一个别名,以便于访问曝光属性。在示例工程中,屏幕 (Screen) 的资源字典具有指向场景占位符的 "MainScene" 别名。
对于 "Inverse Exposure" 属性,来自第 3 步的节点 ("Page") 必须具有绑定:
{#MainScene/Exposure}
需要曝光设置的后处理节点会通过绑定和属性继承从来自第 3 步的节点 ("Page") 获取曝光设置。
"Post Processing Intermediate" 的场景占位符。来自上一步骤的视口 ("Page/Post Processing Intermediate") 必须包含一个用于 "Prefabs/Quad Scene" 预设件(来自第 1 步)的场景占位符。在示例工程中,这是 "Post Processing Intermediate/Scene (Quad Scene)"。
必须将场景占位符的编译器 (Composer) 属性设置为 "Post Processing (1920x1080) Intermediate Composer"。
用于在编译器中产生全屏泛光效果的着色器需要使用下面这些属性来控制全屏泛光效果:
这些属性是可继承的属性,它们来自第 3 步中的节点 ("Page")。
视口必须具有一个用于 Inverse Exposure 属性的绑定,以使其使用来自场景的值:
- {Inverse Exposure} = {../Scene/Exposure}
有关这些属性的详细说明,请参阅属性类型 (Property Types)。
"Final Composition" 的场景占位符。来自第 9 步的视口 ("Page/Final Composition") 应包含一个用于 "Prefabs/Quad Scene" 预设件的场景占位符(来自第 1 步)。在示例工程中,场景名为"Final Composition/Scene (Quad Scene)"。
必须将场景占位符的编译器属性设置为 "Post Processing (1920x1080) Final Composer"。
用于执行全屏泛光合成和色调映射的着色器需要使用下面这些属性:
这些属性是可继承的属性,它们必须来自第 3 步中的节点 ("Page")。
有关这些属性的详细说明,请参阅属性类型 (Property Types)。
请注意,严禁修改这些纹理。
Post Processing (1920x1080) Intermediate Composer。编译器会读取 HDR 纹理,并从中生成一组经过模糊处理和缩放的纹理。
编译器具有交替的水平和垂直渲染通道。每个渲染通道都会在一个维度执行模糊过滤、从输入纹理读取纹理并渲染到输出纹理,输出纹理的大小是指定的维度中的输入纹理的一半。
第一个通道会从 HDR 渲染纹理读取纹理并将其写入到与宽度减半的 HDR 渲染纹理的大小最匹配的渲染目标纹理中。
基于物理的光源属性:
光源色标。基于物理的材质会将光源颜色与光源色标值相乘。这样可以产生高强度光源。
请注意,只适用于物理着色器。不建议将涉及光源的基于物理的材质着色器与非基于物理的材质着色器混合使用。
后处理(全屏泛光效果和色调映射)属性:
环境属性:
材质属性:
Base Color Map(可选)纹理用于在材质类型支持基色图的情况下调节基色。
白色纹理的运用与基色图无关,但使用白色纹理的效率不像在禁用基色图之后创建材质类型那样高。
要使用基色图,材质类型需要支持纹理坐标,而且网格必须具有纹理坐标 (kzTextureCoordinate0)。
RoughnessMapScale(可选)。当材质类型支持表面纹理时,会将 RoughnessMapScale 的值与表面纹理粗糙度通道的值的乘积添加到粗糙度属性的值中。标度可以是负数,也可以是正数。
如果粗糙度纹理具有白色的光亮部分和黑色的粗糙部分,请首先将粗糙度 (Roughness) 设置为 1.0、将 RoughnessMapScale 设置为 -1.0。
Surface texture(可选)。当材质类型支持表面纹理时,会将的中的颜色通道用作粗糙度 (Roughness)、腔体 (Cavity)、金属质感 (Metalness) 和环境光遮蔽 (Ambient occlusion)。
黑色纹理的运用与基色图无关,但使用黑色纹理的效率不像在禁用表面纹理之后创建材质类型那样高。
要使用表面纹理,材质类型需要支持纹理坐标,而且网格必须具有纹理坐标 (kzTextureCoordinate0)。
Normal Map(可选)。当材质类型支持标准图时,属性会选择一个应用于表面的标准图。
要使用切线纹理,需要使用纹理坐标 (kzTextureCoordinate0) 和切线。
使用具有扁平颜色 (0.5, 0.5, 1.0) 的纹理时,与标准图无关。但这种做法的效率不像在禁用表面纹理之后创建材质类型那样高。
各向异性 (Anisotropy)(可选)。当材质类型支持各向异性光反射时,各向异性的绝对值将指定各向异性的量,符号将指定方向。各向异性光反射可提供拉丝金属的外观。
要使用各向异性光反射,网格需要具有切线。您可以使用网格的生成切线 (Generate Tangents) 上下文菜单为任何具有法线和纹理坐标的网格生成切线。
当各向异性值为 0.0 时,意味着表面已完全各向同性,但使用 0.0 各向异性的效率不像在禁用各向异性之后创建材质类型那样高。
切线图 (Tangent Map)(可选)。当材质类型支持切线纹理时,可以从纹理而不是顶点特性获取切线。
要使用切线纹理,需要使用纹理坐标 (kzTextureCoordinate1)。
使用切线纹理可以避免奇异性问题,例如循环拉丝金属。
此文件夹中的所有材质类型都对基于物理的材质使用相同的着色器源。材质类型已通过预处理器定义 (Preprocessor Defines) 属性进行自定义。各种预处理器定义 (Preprocessor Defines) 属性的主要用途是允许创建经过优化的着色器变体。理论上可以使用一个或少数几个基于物理的材质类型变体。但在实践中,可能需要创建更多的基于物理的材质类型变体以实现更高的性能。
要创建新的变体,请复制现有的材质类型,即调整后的预处理器定义所需的最小功能数量,然后点击同步 uniform (Sync with Uniforms)。
着色器使用以下预处理器定义 (Preprocessor Defines):
KANZI_SHADER_USE_AMBIENT_OCCLUSION 用于调节环境光,例如天空光。环境光遮蔽既可以来自顶点颜色,也可以来自表面纹理的阿尔法通道。
0 将禁用环境光遮蔽支持。
1 将启用环境光遮蔽支持。
KANZI_SHADER_USE_AMBIENT_OCCLUSION_VERTEX_ATTRIBUTE。另请参阅 KANZI_SHADER_USE_AMBIENT_OCCLUSION。
0 将选择表面纹理作为环境光遮蔽的来源
1 将选择顶点颜色作为环境光遮蔽的来源
KANZI_SHADER_USE_ANISOTROPY
0 将禁用各向异性光反射支持并加快着色器的速度。
1 将启用各向异性光反射支持并减慢着色器的速度。
KANZI_SHADER_USE_BASECOLOR_TEXTURE
0 将禁用基色纹理支持并加快着色器的速度。
1 将启用基色纹理支持并减慢着色器的速度。
KANZI_SHADER_USE_CAMERA_EXPOSURE 用于控制材质着色器是否执行摄像机曝光。
请注意,KANZI_SHADER_USE_PREFAB_PREVIEW 这一预处理器定义 (preprocessor define ) 允许材质类型使用均匀、激活的摄像机曝光控制摄像机曝光(线性到 sRGB 转换),即使 KANZI_SHADER_USE_CAMERA_EXPOSURE 设置为 0。
0 将禁止在材质着色期间进行摄像机曝光。当使用后处理功能时,请使用设置。
1 将允许在材质着色期间进行摄像机曝光。当不使用后处理功能时,请使用设置。
KANZI_SHADER_USE_NORMALMAP_TEXTURE。标准图需要使用纹理坐标和切线。
0 将允许使用标准图。
1 将禁止使用标准图。
KANZI_SHADER_USE_PREFAB_PREVIEW
0 将禁止使用预设件预览并加快着色器的速度。
1 将允许使用预设件预览并减慢着色器的速度,这样将允许忽略后处理。
KANZI_SHADER_USE_SKY_LIGHT
0 将禁止环境天空光逼近。
1 将允许环境天空光逼近。
KANZI_SHADER_USE_SURFACE_TEXTURE 可用于调节粗糙度、金属、腔体和环境光遮蔽这些材质属性。
0 将禁用表面纹理。
1 将启用表面纹理。
KANZI_SHADER_USE_TANGENT_TEXTURE。切线纹理可以取代所使用的顶点切线。
0 将禁用切线纹理。
1 将启用切线纹理。
KANZI_SHADER_USE_TEXTURE_COORDINATES。当材质类型具有纹理时,您必须启用纹理坐标。
0 将禁用纹理坐标。
1 将启用纹理坐标。
您可以使用这些预处理器定义 (Preprocessor Defines) 进行调试。要允许调试,请将下面这些值设置为 1:
虽然需要使用这些预处理器定义,但它们用于仍处于开发阶段的功能。对于下面这些属性,请始终使用值 0: